將一個指令的輸出結果導向,以便做為其後續指令的輸入,用來連結這 2 個指令的運算元: |,就叫「管線」(pipeline)。
先來看一個例子吧!我們希望查閱 C:\Windows\System32 目錄中所有的檔案與目錄,而且希望查詢的結果,每滿一頁就自動暫停,直到我們按下任何一鍵之後,才又繼續顯示下一頁的結果:
dir C:\Windows\System32 | more
現在要改用 Windows PowerShell 的 Out-Host cmdlet:
Get-ChildItem -Path C:\WINDOWS\System32 | Out-Host -Paging
附註:
由於 -Paging 這個參數對 Out-Host 來說,是唯一的,沒有其他的參數會是以 -P 帶頭,所以可以把 -Paging 簡寫成 -P,就如下同這樣:
Get-ChildItem -Path C:\WINDOWS\System32 | Out-Host -P
萬一,有多個參數都是以 -P 帶頭,就請繼續再輸入該參數後續的字母,直到可以區分出各個參數的意思。
由上面 2 種不同指令執行的結果,您覺得哪一種會比較好呢?
個人是覺得第 2 種輸出會比較好,原因在於最後一行的輸出結果會提示我們要如何進行操作,而第 1 種卻只顯示個 more。
附註:
由於 Get-ChildItem 的別名是 gci,而 Out-Host 的別名是 oh,所以第 2 種寫法的指令可以改成:
gci -Path C:\WINDOWS\System32 | oh -Paging
其實「管線」在 Windows PowerShell 到處都可見,只是它藏身的很好,讓您我都忘記它的存在。以下面的指令來說,就是要查閱 Get-ChildItem 的使用說明:
help Get-ChildItem
或是用:
man Get-ChildItem
我們可以看到,即便沒有指定「管線」運算元,所顯示的結果就會自動用到「管線」。但是,使用下面這樣的指令,就不會用到「管線」哦:
Get-Help Get-ChildItem
此時改用下面這幾個指令都可以:
Get-Help Get-ChildItem | more
Get-Help Get-ChildItem | Out-Host -Paging
Get-Help Get-ChildItem | oh -Paging
現在來個比較實用的例子,假設我們要找出 C:\WINDOWS\System32 目錄中,檔案名稱或目錄名稱開頭是 a ~ c 的:
Get-ChildItem C:\WINDOWS\System32 | Where-Object {$_.name -like "[a-c]*"}
附註:
Where-Object 的別名是 where,所以上面的程式碼可以改為:
Get-ChildItem C:\WINDOWS\System32 | where {$_.name -like "[a-c]*"}
如果希望查詢的結果是以長度(Length)為基準,由小至大進行排序,就再加上 Sort-Object Length:
Get-ChildItem C:\WINDOWS\System32 | Where-Object {$_.name -like "[a-c]*"} | Sort-Object Length
附註:
Sort-Object 的別名是 sort。
剛剛輸出的結果會超過 1 頁,所以使用 Out-Host -Paging 即可每滿 1 頁,就自動暫停顯示:
Get-ChildItem C:\WINDOWS\System32 | Where-Object {$_.name -like "[a-c]*"} | Sort-Object Length | Out-Host -Paging
將過這樣一系列的指令解說,相信大家可以了解到「管線」(pipeline)是可以一直串接下去(前提是前面指令的輸出結果,要可以讓後面的指令接收並處理)。
另外要提醒大家,為了日後維護 Windows PowerShell 程式碼的方便性,還是不要把指令簡寫的太過火,不然就是要加上相關的註解,免得以後自己或接手的人都看不懂程式碼的內容。